#ifndef __EPOLL_H__
#define __EPOLL_H__
#include <sys/epoll.h>

#include "../log/systemLog/systemLog.h"

extern int g_epoll_fd;

/**
 * @brief 创建一个 epoll 实例
 *
 * @param size 最大事件数
 * @return int 成功返回新建的 epoll fd；
 *         参数错误返回 SYSTEM_ERR_INVALID_ARGUMENT；
 *         创建失败返回 SYSTEM_ERR_EPOLL_CREATE
 */
int epoll_create_instance(int size);

/**
 * @brief 向 epoll 实例中添加文件描述符
 *
 * @param epoll_fd epoll 实例的文件描述符
 * @param fd 需要添加的文件描述符
 * @return int 成功返回 SYSTEM_ERR_OK；
 *         参数错误返回 SYSTEM_ERR_INVALID_ARGUMENT；
 *         epoll_ctl 失败返回 SYSTEM_ERR_EPOLL_ADD
 */
int epoll_add_fd(int epoll_fd, int fd);

/**
 * @brief 从 epoll 实例中删除文件描述符
 *
 * @param epoll_fd epoll 实例的文件描述符
 * @param fd 需要删除的文件描述符
 * @return int 成功返回 SYSTEM_ERR_OK；
 *         参数错误返回 SYSTEM_ERR_INVALID_ARGUMENT；
 *         epoll_ctl 失败返回 SYSTEM_ERR_EPOLL_DELETE
 */
int epoll_delete_fd(int epoll_fd, int fd);

// epoll 返回值检查宏：仅记录日志，不改变控制流
#define EPOLL_CREATE_CHECK(ret)                                                   \
    do                                                                            \
    {                                                                             \
        int _ret = (ret);                                                         \
        if (_ret < 0)                                                             \
        {                                                                         \
            system_error_code_t _serr = (_ret == SYSTEM_ERR_INVALID_ARGUMENT)     \
                                            ? SYSTEM_ERR_INVALID_ARGUMENT         \
                                            : SYSTEM_ERR_EPOLL_CREATE;            \
            SYSTEM_LOG_ERROR(_serr, "epoll_create_instance failed ret=%d", _ret); \
        }                                                                         \
    } while (0)

#define EPOLL_ADD_CHECK(ret)                                                  \
    do                                                                        \
    {                                                                         \
        system_error_code_t _ret = (ret);                                     \
        if (_ret != SYSTEM_ERR_OK)                                            \
        {                                                                     \
            system_error_code_t _serr = (_ret == SYSTEM_ERR_INVALID_ARGUMENT) \
                                            ? SYSTEM_ERR_INVALID_ARGUMENT     \
                                            : SYSTEM_ERR_EPOLL_ADD;           \
            SYSTEM_LOG_ERROR(_serr, "epoll_add_fd failed ret=%d", _ret);      \
        }                                                                     \
    } while (0)

#define EPOLL_DELETE_CHECK(ret)                                               \
    do                                                                        \
    {                                                                         \
        system_error_code_t _ret = (ret);                                     \
        if (_ret != SYSTEM_ERR_OK)                                            \
        {                                                                     \
            system_error_code_t _serr = (_ret == SYSTEM_ERR_INVALID_ARGUMENT) \
                                            ? SYSTEM_ERR_INVALID_ARGUMENT     \
                                            : SYSTEM_ERR_EPOLL_DELETE;        \
            SYSTEM_LOG_ERROR(_serr, "epoll_delete_fd failed ret=%d", _ret);   \
        }                                                                     \
    } while (0)

#endif // __EPOLL_H__